package com.starpl.mobile.android.monthunsae.november.domain;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;

import com.starpl.mobile.android.monthunsae.november.common.LocalPushClient;
import com.starpl.mobile.android.platform.common.DateUtil;
import com.starpl.mobile.android.platform.common.SharedUtil;


/**
 * 월별운세 데이터를 저장하는 도메인 클래스
 * 
 * @author 우연화
 * @since 2011.03.17
 */
public class MonthUnsae implements Serializable
{
	private static final long serialVersionUID = 1L;

	private static String TAG = "MonthUnsae";
	
	// 연애운정보
	private String loveContent;
	
	// 재물운 정보
	private String moneyContent;
	
	// 일자
	private String unsaeDate;
	
	// *월 운세에 사용되는 5가지 운세 정보 데이터
	private String introduction;
	private String luckyDay;
	private String prescription;
	private String health;
	private String business;
	
	
	private ArrayList<MonthUnsaeDay> monthUnsaeDayList;

	/**
	 * 월별운세 클래스 기본 생성자
	 */
	public MonthUnsae()
	{
		super();
	}

	/**
	 * 월별운세 클래스 데이터 입력 생성자
	 * 
	 * @param object
	 */
	public MonthUnsae(JSONObject object)
	{
		super();

		try
		{
			JSONObject ext1 = object.getJSONObject("extData1");
			JSONArray data = object.getJSONArray("data");

			loveContent = ext1.getString("LOVE");
			moneyContent = ext1.getString("MONEY");
			unsaeDate = ext1.getString("unsaeDate");
			introduction = ext1.getString("INTRO");
			luckyDay = ext1.getString("GoodMon");
			prescription = ext1.getString("SuccessMon");
			health = ext1.getString("Health");
			business = ext1.getString("Job");
			
			monthUnsaeDayList = new ArrayList<MonthUnsaeDay>();
			
			// 월별 운세 알람을 등록하기 위한 기본 작업
			LocalPushClient alarmClient = new LocalPushClient();
			DateUtil dateUtil = new DateUtil(unsaeDate);
			Date date = dateUtil.getDate();
			date.setHours(10);
			date.setMinutes(0);
			date.setSeconds(0);
			
			// 오늘의 날짜
			Date today = new Date();
			
			// 디바이스 재부팅시 복원을 위한 데이터 제작
			StringBuffer alarmArray = new StringBuffer();
			alarmArray.append("[");

			int length = data.length();
			for(int i = 0 ; i < length ; i++)
			{
				MonthUnsaeDay day = new MonthUnsaeDay(data.getJSONObject(i));
				monthUnsaeDayList.add(day);
				
				// 월별 운세 알람을 등록한다
				date.setDate(Integer.parseInt(day.getDayOfMonth().substring(0, 2)));
				
				// 오늘의 날짜보다 이전 시각의 푸시는 무시한다.
				if(date.getTime() < today.getTime())
				{
					continue;
				}
				
				String iconName = day.getIconName();
				String message;
				if(iconName.startsWith("용신"))
				{
					message = "오늘 운세가 너무 좋네요!\n지금 바로 확인해 보세요";
				}
				// 월별운세 10월 정책으로 나쁜 운세 알림은 뺀다.
//				else if(iconName.startsWith("양인"))
//				{
//					message = "오늘 운세가 너무 나쁘네요!\n지금 바로 확인해 보세요";
//				}
				else
				{
					message = null;
				}
				
				// 알람 메시지를 삭제한다. 무조건 삭제를 해야 하는 이유는 정보의 변경등을 고려해서임
				alarmClient.removeLocalPush(date);
			
				// 알람 메시지가 있을 경우에만 알람 등록을 한다.
				long pushMilliSecond;
				if(message != null)
				{
					pushMilliSecond = alarmClient.setLocalPush(date, message);
					alarmArray.append("{\"date\":" + pushMilliSecond + ", \"msg\":\"" + message + "\"}");
					
					if(i < length - 1)
					{
						alarmArray.append(",");
					}
				}
			}
			
			alarmArray.append("]");
			
			SharedUtil.getInstance().putSharedPreference("alarmList", alarmArray.toString());

		}
		catch(JSONException e)
		{
			Log.e(TAG, e.getMessage());
		}
	}

	/**
	 * 달력 아래의 연애운 데이터를 반환합니다.
	 * 
	 * @return String
	 */
	public String getLoveContent()
	{
		return loveContent;
	}

	/**
	 * 달력 아래의 연애운 데이터를 저장합니다.
	 * 
	 * @param String
	 */
	public void setLoveContent(String loveContent)
	{
		this.loveContent = loveContent;
	}

	/**
	 * 달력 아래의 재물운 데이터를 반환합니다.
	 * 
	 * @return String
	 */
	public String getMoneyContent()
	{
		return moneyContent;
	}

	/**
	 * 달력 아래의 연애운 데이터를 반환합니다.
	 * 
	 * @param String
	 */
	public void setMoneyContent(String moneyContent)
	{
		this.moneyContent = moneyContent;
	}

	/**
	 * 해당 운세 일자(통신용 Date String)를 반환합니다.
	 * 
	 * @return yyyy-MM-dd HH:mm:ss
	 */
	public String getUnsaeDate()
	{
		return unsaeDate;
	}

	/**
	 * 해당 운세 일자(통신용 Date String)를 저장합니다.
	 * 
	 * @param unsaeDate
	 */
	public void setUnsaeDate(String unsaeDate)
	{
		this.unsaeDate = unsaeDate;
	}

	/**
	 * 월별운세 데이터를 반환합니다.
	 * 
	 * dayOfMonth : 일자
	 * iconName : 아이콘이름(ex-용신7, 희신9 등)
	 * loveNum : 해당일자의 연애운 점수(-1.0 ~ 1.0)
	 * moneyNum : 해당일자의 재물운 점수(-1.0 ~ 1.0)
	 * dayContent : 해당일자의 운세정보(String)
	 * 
	 * @return ArrayList<MonthUnsaeDay>
	 */
	public ArrayList<MonthUnsaeDay> getMonthUnsaeDayList()
	{
		return monthUnsaeDayList;
	}

	/**
	 * 월별운세 데이터를 저장합니다.
	 * 
	 * MonthUnsaeDay * 
	 * dayOfMonth : 일자
	 * iconName : 아이콘이름(ex-용신7, 희신9 등)
	 * loveNum : 해당일자의 연애운 점수(-1.0 ~ 1.0)
	 * moneyNum : 해당일자의 재물운 점수(-1.0 ~ 1.0)
	 * dayContent : 해당일자의 운세정보(String)
	 * 
	 * @param monthUnsaeDayList
	 */
	public void setMonthUnsaeDayList(ArrayList<MonthUnsaeDay> monthUnsaeDayList)
	{
		this.monthUnsaeDayList = monthUnsaeDayList;
	}

	/**
	 * 이달의 총론을 반환합니다.
	 * 
	 * @return
	 */
	public String getIntroduction()
	{
		return introduction;
	}

	/**
	 * 이달의 총론을 저장합니다.
	 * 
	 * @param introduction
	 */
	public void setIntroduction(String introduction)
	{
		this.introduction = introduction;
	}

	/**
	 * 이달의 길일을 반환합니다.
	 * 
	 * @return
	 */
	public String getLuckyDay()
	{
		return luckyDay;
	}

	/**
	 * 이달의 길일을 저장합니다.
	 * 
	 * @param luckyDay
	 */
	public void setLuckyDay(String luckyDay)
	{
		this.luckyDay = luckyDay;
	}

	/**
	 * 이달의 처방전을 반환합니다.
	 * 
	 * @return
	 */
	public String getPrescription()
	{
		return prescription;
	}

	/**
	 * 이달의 처방전을 저장합니다.
	 * 
	 * @param prescription
	 */
	public void setPrescription(String prescription)
	{
		this.prescription = prescription;
	}

	/**
	 * 이달의 건강운을 반환합니다.
	 * 
	 * @return
	 */
	public String getHealth()
	{
		return health;
	}

	/**
	 * 이달의 건강운을 저장합니다.
	 * 
	 * @param health
	 */
	public void setHealth(String health)
	{
		this.health = health;
	}

	/**
	 * 이달의 영업/거래/매매운을 반환합니다.
	 * 
	 * @return
	 */
	public String getBusiness()
	{
		return business;
	}

	/**
	 * 이달의 영업/거래/매매운을 저장합니다.
	 * 
	 * @param business
	 */
	public void setBusiness(String business)
	{
		this.business = business;
	}
}
